#ifndef I2S_AUDIO_RECORDER_H
#define I2S_AUDIO_RECORDER_H

#include "stm32g4xx_hal.h"
#include "i2s.h"
#include "app_fatfs.h"

/* WAV文件头结构 */
typedef struct {
    uint8_t riff_header[4];  // "RIFF"
    uint32_t file_size;      // 文件总大小 - 8
    uint8_t wave_header[4];  // "WAVE"
    uint8_t fmt_header[4];   // "fmt "
    uint32_t fmt_chunk_size; // 16 for PCM
    uint16_t audio_format;   // 1 for PCM
    uint16_t num_channels;   // 声道数
    uint32_t sample_rate;    // 采样率
    uint32_t byte_rate;      // 字节率 = 采样率 * 声道数 * 位深/8
    uint16_t block_align;    // 块对齐 = 声道数 * 位深/8
    uint16_t bit_depth;      // 位深
    uint8_t data_header[4];  // "data"
    uint32_t data_size;      // 音频数据大小
} WavHeader;

/* 音频配置参数 */
#define AUDIO_SAMPLE_RATE 16000
#define AUDIO_BIT_DEPTH   32
#define AUDIO_CHANNELS    2
#define BUFFER_SIZE       128 // 每个缓冲区的样本数

/* 外部变量声明 */
extern I2S_HandleTypeDef hi2s2;
extern SPI_HandleTypeDef hspi1;
extern FATFS fs;
extern FIL file;

/* 函数声明 */
// 初始化WAV文件头
static void InitWavHeader(WavHeader *header, uint32_t sample_rate,
                          uint16_t num_channels, uint16_t bit_depth);

// 查找下一个可用的文件名
static FRESULT find_next_available_filename(char *filename);

// 初始化音频录制系统
HAL_StatusTypeDef AudioRecorder_Init(void);

// 开始录制音频到文件
HAL_StatusTypeDef StartRecording(void);

// 停止录制
void StopRecording(void);

// 处理音频数据 - 将缓冲区数据写入SD卡
void ProcessAudioData(void);

// I2S DMA半传输完成回调
void HAL_I2S_RxHalfCpltCallback(I2S_HandleTypeDef *hi2s);

// I2S DMA传输完成回调
void HAL_I2S_RxCpltCallback(I2S_HandleTypeDef *hi2s);
void pcm_bin_test(void);

// 返回值定义
#define WAV_SUCCESS          0 // 成功
#define WAV_ERR_MOUNT        1 // 文件系统挂载失败
#define WAV_ERR_CREATE_FILE  2 // 创建文件失败
#define WAV_ERR_WRITE_HEADER 3 // 写入文件头失败
#define WAV_ERR_WRITE_DATA   4 // 写入数据失败

#endif /* AUDIO_RECORDER_H */
